home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacHack 1997
/
MacHack 1997.toast
/
Hacks
/
Hacks ’97
/
NewsTicker
/
source code
/
Internet Code
/
SubWooferEndPoint.cp
< prev
next >
Wrap
Text File
|
1997-06-27
|
6KB
|
300 lines
/*------------------------------------------------------------------------------
#
# NewsTicker, my Hack for 1997
#
# SubWooferEndPoint.cp - Uses SubWoofer to read html pages in
#
------------------------------------------------------------------------------*/
#include <Errors.h>
#include <string.h>
#include "SubWooferEndPoint.h"
#include "HTMLExtractor.h"
static OSStatus MyNotifier(SubWooferEndPoint* me, URLReference urlRef, URLEvent event,
const char* changed, UInt32 downloadSize)
{
me->HandleSubWoofer(event, changed);
return noErr;
}
//
// Our constructor
//
SubWooferEndPoint::SubWooferEndPoint( HTMLExtractor* theHandler )
{
mfDataWaiting = false;
mfDoShutdown = false;
mfBytesReceived = 0;
mfMyHandler = theHandler;
mfTheReference = nil;
}
//
// Our destructor
//
SubWooferEndPoint::~SubWooferEndPoint( void )
{
HandleShutdown();
if (mfTheReference)
URLDisposeReference(mfTheReference);
}
//
// Say we want to get the page
//
OSErr SubWooferEndPoint::StartGettingFile(char* address, short port, Idler* theIdler)
{
#ifdef USESUBWOOFER
OSErr io;
char newaddress[32] = "http://";
strcat(newaddress, address);
mfDataWaiting = false;
mfDoShutdown = false;
mfDoingHeader = false;
mfBytesReceived = 0;
//start getting the file
if (mfTheReference)
URLDisposeReference(mfTheReference);
io = URLNewReference(newaddress, &mfTheReference);
if (io==noErr)
{
//Start connecting to the URL
io = URLOpen(mfTheReference,nil, 0, // openFlags,
(URLNotifyProcPtr)MyNotifier, // notifyProc,
kURLAllEventsFlag, //kURLDataAvailableEventFlag+kURLErrorOccurredEventFlag+kURLCompletedEventFlag, //event flags
(unsigned long)this);
}
if (io!=noErr)
{
DebugStr("\pError opening");
HandleShutdown();
}
return io;
#else
return -1;
#endif
}
OSErr SubWooferEndPoint::StartGettingHeader(char* address, short port, Idler* theIdler)
{
#ifdef USESUBWOOFER
OSErr io;
char newaddress[32] = "http://";
strcat(newaddress, address);
mfDataWaiting = false;
mfDoShutdown = false;
mfDoingHeader = true;
mfBytesReceived = 0;
//start getting the file
if (mfTheReference)
URLDisposeReference(mfTheReference);
io = URLNewReference(newaddress, &mfTheReference);
if (io==noErr)
{
//Start connecting to the URL
io = URLOpen(mfTheReference,nil, 0, // openFlags,
nil, // notifyProc,
kURLDataAvailableEventFlag+kURLErrorOccurredEventFlag+kURLCompletedEventFlag, //event flags
(unsigned long)this);
}
if (io!=noErr)
{
HandleShutdown();
}
return io;
#else
return -1;
#endif
}
//
// Handle an event from SubWoofer
//
void SubWooferEndPoint::HandleSubWoofer(URLEvent event, const char* changed)
{
#ifdef USESUBWOOFER
switch (event)
{
case kURLDataAvailableEvent:
mfDataWaiting = true;
if (mfDoingHeader)
mfDoShutdown = true; //bail after we've got the header if that's all we want
break;
case kURLCompletedEvent:
mfDoShutdown = true;
break;
}
#endif
}
//
// Handle the work of everything we have to do
//
void SubWooferEndPoint::DoIdle(void)
{
#ifdef USESUBWOOFER
OSErr io;
char* buffer;
Size bufferSize;
short index;
Boolean GotOne;
Size available;
if (mfDoShutdown)
{
HandleShutdown();
mfDoShutdown = false;
}
if (mfDataWaiting)
{
mfDataWaiting = false;
io = URLGetDataAvailable(mfTheReference, &available);
if (io!=noErr)
return;
//read some data in
bufferSize = sizeof(mfInComingData) - mfBytesReceived;
if (bufferSize<available)
bufferSize = available;
io = URLGetBuffer(mfTheReference, &buffer, &bufferSize);
if (io!=noErr)
{
URLReleaseBuffer(mfTheReference, buffer);
return;
}
BlockMove(buffer, &mfInComingData[mfBytesReceived], bufferSize);
URLReleaseBuffer(mfTheReference, buffer);
mfBytesReceived += bufferSize;
available -= bufferSize;
do //parse out all the lines of text
{
GotOne = false;
for (index = 0; index < mfBytesReceived; index++)
{
if (mfInComingData[index]==0x0A) //found end of line, line feed of cr/lf
{
GotOne = true;
index++; //convert the index into the size
if (mfMyHandler) //have them handle it and clear it
mfMyHandler->ReceiveString(mfInComingData, index);
BlockMove(&mfInComingData[index], &mfInComingData[0], mfBytesReceived-index);
mfBytesReceived-=index;
index = 0;
}
}
if (!GotOne)
{
for (index = 0; index < mfBytesReceived; index++)
{
if (mfInComingData[index]==0x0D) //Does this one have just returns?
{
GotOne = true;
index++; //convert the index into the size
if (mfMyHandler) //have them handle it and clear it
mfMyHandler->ReceiveString(mfInComingData, index);
BlockMove(&mfInComingData[index], &mfInComingData[0], mfBytesReceived-index);
mfBytesReceived-=index;
index = 0;
}
}
}
if ((!GotOne)&&(mfBytesReceived>sizeof(mfInComingData)/2)) //it's just a whole lot with no line feed
{
if (mfMyHandler) //have them handle it and clear it
mfMyHandler->ReceiveString(mfInComingData, mfBytesReceived);
mfBytesReceived = 0;
}
}
while (GotOne);
io = URLGetDataAvailable(mfTheReference, &available);
mfDataWaiting = (io == noErr) && (available>0);
}
#endif
}
//
// Close The File
//
void SubWooferEndPoint::HandleShutdown(void)
{
#ifdef USESUBWOOFER
if (mfMyHandler)
{
mfMyHandler->Disconnect();
}
#endif
}
//
// Get the header
//
OSErr SubWooferEndPoint::GetSubWoofHeader(Str31 ModDate)
{
#ifdef USESUBWOOFER
OSErr io;
Str255 tempstr;
char* cp;
Size offset;
char* thebuffer;
Size thesize;
ModDate[0] = 0;
if (mfMyHandler)
{
io = URLGetPropertySize(mfTheReference, kURLHTTPRespHeader, &thesize);
if (io!=noErr)
return io;
thebuffer = NewPtrClear(thesize);
io = URLGetProperty(mfTheReference, kURLHTTPRespHeader, thebuffer, thesize);
if (io==noErr)
{
cp = thebuffer; offset = thesize;
do
{
if (MyCompareStr(cp, "Last-Modified:"))
{
cp += 15; offset -= 15; //skip past the last-modified
do
{
ModDate[0]++;
ModDate[ModDate[0]] = *cp;
cp++; offset--;
}
while ((offset>0) && (*cp!=0x0D)&&(ModDate[0]<31));
DisposePtr(thebuffer);
return noErr;
}
do
{
cp++; offset--;
}
while ((offset>0)&&(*cp!=0x0A));//linefeed
cp++; offset--; //skip past the line feed
}
while (offset>0);
}
DisposePtr(thebuffer);
return io;
}
else return -1;
#endif
}